﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using static Csharpzuoye.Problem;

namespace Csharpzuoye
{
    public class Repoistory : Entity 
    {
        //仓储模式 负责对象的增删查
        //静态作业
        // 定义一个仓库（Repoistory）类，用于存取对象，其中包含：
        //1.一个int类型的常量version(版本)
        //2.一个静态只读的字符串connection（连接），以后可用于连接数据库
        //3.思考Respoitory应该是static类还是实例类更好
        //实例，静态的不能继承，没有子类，不能面向对象编程

        private const int version = 1;
        private static readonly string connection;


        //    利用Linq to EntityFramework，实现方法： 扩展方法在不修改原来类代码的基础上，给类添加实例方法

        //GetBy(IList<ProblemStatus> exclude, bool hasSummary, bool descByPublishTime)，该方法可以根据输入参数：

        //IList<ProblemStatus> exclude：不显示（排除）某些状态的求助
        //bool hasReward：只显示已有总结的求助（如果传入值为true的话）
        //bool descByPublishTime：按发布时间正序还是倒序

        private SqlDbContext context;
        public Repoistory()
        {
            context = new SqlDbContext();
        }
        public IQueryable<Problem> GetBy(IList<ProblemStatus> exclude, bool hasReward, bool descByPublishTime)
        {
            IQueryable<Problem> problems = context.Problems;

            if (exclude != null)
            {
                problems = problems.GetExclude(exclude);
            }
            if (hasReward)
            {
                problems = problems.GetHasReward();
            }
            problems.GetPublishtime(descByPublishTime);

            return problems;
        }
    }
    public static class Extension
    {
        public static IQueryable<Problem> GetExclude(this IQueryable<Problem> problems, IList<ProblemStatus> exclude)
        {
            return problems.Where(p => !exclude.Contains(p.Status));
        }

        public static IQueryable<Problem> GetHasReward(this IQueryable<Problem> problems)
        {
            return problems.Where(p => p.EFReward > 0);
        }
        public static IQueryable<Problem> GetPublishtime(this IQueryable<Problem> problems, bool asc = true)
        {
            if (asc)
            {
                return problems.OrderBy(p => p.Publishtime);
            }
            else
            {
                return problems.OrderByDescending(p => p.Publishtime);
            }
        }
        //    实现方法：GetMessage()，靠将消息列表：

        //所有未读在已读前面
        //未读和已读各自按生成时间排序

        public static IList<Message> GetMessages()
        {
            SqlDbContext context = new SqlDbContext();
            return context.Messages.OrderBy(q => q.UnRead).ThenBy(q => q.GeneratedTime).ToList();
        }

    }
}
